home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '93 / Papers '93 / Macintosh as Internet Server ƒ / inetd / Libraries / MacTCPLib / UDP.cp < prev    next >
Encoding:
Text File  |  1993-04-08  |  2.5 KB  |  140 lines  |  [TEXT/MPS ]

  1.  
  2. #include "UDP.h"
  3. #include "Driver.h"
  4.  
  5. #include <myUtils.h>
  6.  
  7. #include <Memory.h>
  8.  
  9. StreamPtr
  10. udpCreate(int bufSize, udp_port* local, UDPNotifyProc asr, Ptr usrData)
  11. {
  12.     UDPiopb    pb;
  13.     OSErr    theErr;
  14.     Ptr        buffer;
  15.     
  16.     buffer = NewPtr(bufSize);
  17.     if (MemError() != noErr)
  18.         return MemError();
  19.         
  20.     pb.csCode        = UDPCreate;
  21.     pb.ioCRefNum    = gRef.GetRef();
  22.     pb.ioCompletion    = nil;
  23.     
  24.     pb.csParam.create.rcvBuff         = buffer;
  25.     pb.csParam.create.rcvBuffLen    = bufSize;
  26.     pb.csParam.create.notifyProc    = asr;
  27.     pb.csParam.create.userDataPtr    = usrData;
  28.     pb.csParam.create.localPort        = *local;
  29.         
  30.     theErr = PBControlSync((ParmBlkPtr) &pb);
  31.     
  32.     if (theErr == noErr) {
  33.         *local = pb.csParam.create.localPort;
  34.         return pb.udpStream;
  35.     }
  36.     else 
  37.         return (StreamPtr) theErr;
  38. }
  39.  
  40. OSErr
  41. udpRead(StreamPtr stream, void* buffer, short* len)
  42. {
  43.     OSErr    theErr;
  44.     UDPiopb    pb;
  45.     short    in;
  46.     
  47.     BlockClear(&pb, sizeof(pb));
  48.     
  49.     pb.ioCRefNum    = gRef.GetRef();
  50.     pb.udpStream    = stream;
  51.     pb.csCode        = UDPRead;
  52.     
  53.     theErr = PBControlSync((ParmBlkPtr) &pb);
  54.     
  55.     if (theErr == noErr) {
  56.         in = pb.csParam.receive.rcvBuffLen;
  57.         if (in > *len)
  58.             in = *len;
  59.         
  60.         BlockMove(pb.csParam.receive.rcvBuff, buffer, in);
  61.         *len = in;
  62.  
  63.         if (in) {
  64.             pb.csCode = UDPBfrReturn;
  65.             theErr = PBControlSync((ParmBlkPtr) &pb);
  66.         }
  67.     }
  68.     
  69.     return theErr;
  70. }
  71.  
  72. OSErr
  73. udpWrite(StreamPtr stream, void* buffer, short len, ip_addr host, udp_port port)
  74. {
  75.     typedef struct OneWDS {
  76.         wdsEntry        wds;
  77.         unsigned short    zero;
  78.     } OneWDS;
  79.  
  80.     UDPiopb    pb;
  81.     OneWDS    wds;
  82.     
  83.     BlockClear(&pb, sizeof(pb));
  84.     
  85.     wds.zero        = 0;
  86.     wds.wds.ptr        = buffer;
  87.     wds.wds.length    = len;
  88.     
  89.     pb.ioCRefNum    = gRef.GetRef();
  90.     pb.udpStream    = stream;
  91.     pb.csCode        = UDPWrite;
  92.     
  93.     pb.csParam.send.remoteHost    = host;
  94.     pb.csParam.send.remotePort    = port;
  95.     pb.csParam.send.wdsPtr        = (Ptr) &wds;
  96.     pb.csParam.send.checkSum    = 0;
  97.     
  98.     return PBControlSync((ParmBlkPtr) &pb);
  99. }
  100.  
  101. OSErr
  102. udpWriteWDS(StreamPtr stream, wdsEntry* wds, ip_addr host, udp_port port)
  103. {
  104.     UDPiopb    pb;
  105.     
  106.     BlockClear(&pb, sizeof(pb));
  107.     
  108.     pb.ioCRefNum    = gRef.GetRef();
  109.     pb.udpStream    = stream;
  110.     pb.csCode        = UDPWrite;
  111.     
  112.     pb.csParam.send.remoteHost    = host;
  113.     pb.csParam.send.remotePort    = port;
  114.     pb.csParam.send.wdsPtr        = (Ptr) wds;
  115.     pb.csParam.send.checkSum    = 0;
  116.     
  117.     return PBControlSync((ParmBlkPtr) &pb);
  118. }
  119.  
  120. OSErr
  121. udpRelease(StreamPtr stream)
  122. {
  123.     UDPiopb    pb;
  124.     OSErr    theErr;
  125.     
  126.     pb.ioCompletion = nil;
  127.     pb.ioCRefNum    = gRef.GetRef();
  128.     pb.udpStream    = stream;
  129.     pb.csCode        = UDPRelease;
  130.     
  131.     theErr = PBControlSync((ParmBlkPtr) &pb);
  132.     
  133.     if (theErr == noErr) {
  134.         DisposePtr(pb.csParam.create.rcvBuff);
  135.         theErr = MemError();
  136.     }
  137.     
  138.     return theErr;
  139. }
  140.